<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------

// 应用公共文件

use Amap\Amap;
use app\common\logic\SnowflakeLogic;
use Faker\Factory;

if (!function_exists('app_path')) {
    /**
     * 应用根目录
     * @param $path
     * @return string
     */
    function app_path($path = ''): string
    {
        return dirname(__DIR__) . $path;
    }
}

if (!function_exists('public_path')) {
    /**
     * 公共目录
     * @param $path
     * @return string
     */
    function public_path($path = ''): string
    {
        return dirname(__DIR__) . '/public' . $path;
    }
}

if (!function_exists('substr_cut')) {
    /**
     * 隐藏昵称
     * @param $user_name
     * @param $length
     * @return string
     */
    function substr_cut($user_name, $agolen = 1, $afterlen = 1): string
    {
        if (mb_strlen($user_name) <= 1) {
            return $user_name . '*';
        }
        $strlen = mb_strlen($user_name, 'utf-8');
        $firstStr = mb_substr($user_name, 0, $agolen, 'utf-8');
        $lastStr = mb_substr($user_name, $strlen - $afterlen, $afterlen, 'utf-8');
//        return $strlen == 2 ? $firstStr . str_repeat('*', mb_strlen($user_name, 'utf-8') - 1) : $firstStr . str_repeat("*", $strlen - 2) . $lastStr;
        return $firstStr . str_repeat("*", $strlen - $agolen - $afterlen) . $lastStr;
    }
}

if (!function_exists('create_trade_no')) {
    /**
     * 生成不重复的订单号（可以指定前缀和会员ID）
     * @param $string
     * @return string
     */
    function create_trade_no($prefix = '', $member_id = ''): string
    {
        /*$uuid = uniqid();
        $uuid = hexdec($uuid);*/
        $random = rand(1000, 9999);

        $currentDate = date('YmdHis');

        if ($member_id) {
            $trade_no = $currentDate . $random . $member_id;
        } else {
//            $trade_no = $currentDate . $uuid;
            $trade_no = $currentDate . time();
        }
        if ($prefix) {
            $trade_no = $prefix . $trade_no;
        }

        return $trade_no;
    }
}

if (!function_exists('amap')) {
    /**
     * 高德地图api
     * @return Amap
     */
    function amap()
    {
        $options = [
            'sign' => false, //是否进行数字签名，默认不签名
            'private_key' => '', //数字签名私钥，sign=true时必填
            'key' => '8e84c9df8db64a4b68062d9088b978f4',//api调用key，必填
        ];
        return new Amap($options);
    }
}

if (!function_exists('replace_url')) {
    /**
     * 替换文件地址为带域名的地址
     * @param $url
     * @return mixed|string
     */
    function replace_url($url)
    {
        if (strstr($url, 'http:') || strstr($url, 'https:') || empty($url)) {
            return $url;
        }
        $baseUrl = config('app.domain') . '/';
        $header = request()->header('user-agent');
        if (strstr($header, 'MicroMessen')) {
            $baseUrl = config('app.domain');
        }
        return $baseUrl . $url;
    }
}

if (!function_exists('replace_href_url')) {
    /**
     * 替换href地址返回带域名的完整下载地址
     * @param $content
     * @return array|mixed|string|string[]
     */
    function replace_href_url($content)
    {
        $preg = '/<a .*?href="(.*?)".*?>/is';
        preg_match_all($preg, $content, $array2);
        for ($i = 0; $i < count($array2[1]); $i++) //逐个输出超链接地址
        {
            if (strpos($array2[1][$i], "http") === false) {
                $content = str_replace('href="' . $array2[1][$i], 'href="' . config('app.domain') . $array2[1][$i], $content);
            }
        }

        return $content;
    }
}

if (!function_exists('replace_src_url')) {
    /**
     * 替换src地址返回带域名的完整下载地址
     * @param $content  要替换的信息
     * @param $style    需要附加进去的附加样式
     * @return array|mixed|string|string[]
     */
    function replace_src_url($content, $style = "")
    {
        $preg = '/<img .*?src="(.*?)".*?>/is';
        preg_match_all($preg, $content, $array2);
        if (!$array2) {
            $array2 = array();
        }
        for ($i = 0; $i < count($array2[1]); $i++) //逐个输出超链接地址
        {
            if (strpos($array2[1][$i], "http") === false) {
                $content = str_replace('src="' . $array2[1][$i], $style . ' src="' . config('app.domain') . $array2[1][$i], $content);
            }
        }

        return $content;
    }
}

if (!function_exists('date_now')) {
    /**
     * 当前时间
     * @return false|string
     */
    function date_now($format = 'Y-m-d H:i:s')
    {
        return date($format, time());
    }
}

if (!function_exists('passCrypt')) {
    /**
     * 加密密码
     * @param $pwd  需要加密的密码
     * @return array
     */
    function passCrypt($pwd = 'Pass_2024')
    {
        $pass = md5($pwd);
        $salt = substr($pass, 7 + mt_rand(5, 10), 7);
        $pwd = md5($salt . $pwd . $salt);
        return [$pwd, $salt];
    }
}

if (!function_exists('passEncryp')) {
    /**
     * 加密密码
     * @param $salt 加密盐
     * @param $pass  需要加密的密码
     * @return string
     */
    function passEncryp($salt, $pass = 'Pass_2024')
    {
        return md5($salt . $pass . $salt);
    }
}

if (!function_exists('passValidate')) {
    /**
     * 验证密码
     * @param $pwd      原密码
     * @param $salt     加密盐
     * @param $inputpwd 需要验证的密码
     * @return bool
     */
    function passValidate($salt, $pwd, $inputpwd)
    {
        // 明文前后加随机字符，再md5加密
        if (md5($salt . $inputpwd . $salt) == $pwd) {
            return true;
        } else {
            return false;
        }
    }
}

if (!function_exists('createUsername')) {
    /**
     * 生成随机用户名/手机号（时间戳）
     * @return string
     */
    function createUsername()
    {
        $username = time() . rand(0, 9);
        return $username;
    }
}

if (!function_exists('createFullName')) {
    /**
     * 生成随机姓名
     * @return string
     */
    function createFullName()
    {
        $faker = Factory::create('zh_CN');
        return $faker->name();
    }
}

if (!function_exists('createPhoneNumber')) {
    /**
     * 生成随机手机号
     * @return string
     */
    function createPhoneNumber()
    {
        $faker = Factory::create('zh_CN');
        return $faker->phoneNumber();
    }
}

if (!function_exists('snowflake_id')) {
    /**
     * 雪花算法，生成ID
     * @return mixed
     */
    function snowflake_id()
    {
        return (new SnowflakeLogic())->id();
    }
}

if (!function_exists('calculate')) {
    /**
     * 数学计算
     * @param $n1       数字1
     * @param $symbol   运算符
     * @param $n2       数字2
     * @param $scale    保留几位小数运算
     * @return array|int|string|string[]
     */
    function calculate($n1, $symbol, $n2, $scale = 2)
    {
        $res = "";
        if (strpos($n1, "E") > -1) {
            $n1 = 0;
        }
        if (strpos($n2, "E") > -1) {
            $n2 = 0;
        }
        switch ($symbol) {
            case "+": //加法
                if (function_exists("bcadd")) {
                    $res = bcadd($n1, $n2, $scale);
                } else {
                    $res = $n1 + $n2;
                }
                break;
            case "-": //减法
                if (function_exists("bcsub")) {
                    $res = bcsub($n1, $n2, $scale);
                } else {
                    $res = $n1 - $n2;
                }
                break;
            case "*": //乘法
                if (function_exists("bcmul")) {
                    $res = bcmul($n1, $n2, $scale);
                } else {
                    $res = $n1 * $n2;
                }
                break;
            case "/": //除法
                if ($n1 <= 0 || $n2 <= 0) {
                    return 0;
                }
                if (function_exists("bcdiv")) {
                    $res = bcdiv($n1, $n2, $scale);
                } else {
                    $res = $n1 / $n2;
                }
                break;
            case "%": //求余、取模
                if (function_exists("bcmod")) {
                    $res = bcmod($n1, $n2, $scale);
                } else {
                    $res = $n1 % $n2;
                }
                break;
            default:
                $res = "";
                break;
        }
        $res = str_ireplace(",", "", $res);
        return $res;
    }
}

if (!function_exists('calc_time_diff')) {
    /**
     * 计算时间差
     * @param $startTime
     * @param $endTime
     * @return array
     */
    function calc_time_diff($startTime, $endTime = null)
    {
        if (!$endTime) {
            $endTime = date_now();
        }
        $t = strtotime($endTime) - strtotime($startTime);//单位"秒"
        $arr = [];
        $day = intval($t / 86400);//天
        $arr['day'] = $day;
        $hour = intval((($t / 86400) - $day) * 24);//小时
        $arr['hour'] = $hour;
        $minute = intval((((($t / 86400) - $day) * 24) - $hour) * 60);//分钟
        $arr['minute'] = $minute;
        $second = intval(((((((($t / 86400) - $day) * 24) - $hour) * 60) - $minute) * 60));//秒
        $arr['second'] = $second;
        return $arr;
    }
}

if (!function_exists('generateAESKey')) {
    /**
     * 生成AES密钥
     * AES-128 需要16个字节的密钥
     * AES-192 需要24个字节的密钥
     * AES-256 需要32个字节的密钥
     * @param $length
     * @param $convert
     * @return string
     * @throws Exception
     */
    function generateAESKey($length = 32, $convert = false)
    {
        $key = openssl_random_pseudo_bytes($length, $strong);
        if (!$strong || $key === false) {
            throw new Exception('Unable to generate random key');
        }
        if ($convert) {
            return bin2hex($key);
        }
        return $key;
    }
}

if (!function_exists('encrypt')) {
    /**
     * 加密函数
     * @param $data
     * @param $key
     * @param $safe
     * @param $algo
     * @return array|string|string[]
     */
    function encrypt($data, $key, $safe = false, $algo = 'AES-256-ECB')
    {
        $encrypted = openssl_encrypt($data, $algo, $key, OPENSSL_RAW_DATA);

        if ($safe) {
            return urlsafe_base64encode($encrypted);
        } else {
            return base64_encode($encrypted);
        }
    }
}

if (!function_exists('decrypt')) {
    /**
     * 解密函数
     * @param $data
     * @param $key
     * @param $safe
     * @param $algo
     * @return false|string
     */
    function decrypt($data, $key, $safe = false, $algo = 'AES-256-ECB')
    {
        if ($safe) {
            $encrypted = urlsafe_base64decode($data);
        } else {
            $encrypted = base64_decode($data);
        }

        $decrypted = openssl_decrypt($encrypted, $algo, $key, OPENSSL_RAW_DATA);

        return $decrypted;
    }
}

if (!function_exists('urlsafe_base64encode')) {
    /**
     * URL安全的Base64编码
     * 先将内容编码成Base64结果
     * 将结果中的加号“+”替换成中划线“-”
     * 将结果中的斜杆“/"替换成下划线”_“
     * 将结果中尾部的等号“=”全部保留
     * @param $string
     * @return array|string|string[]
     */
    function urlsafe_base64encode($string)
    {
        $data = base64_encode($string);
        $data = str_replace(array('+', '/', '='), array('-', '_', ''), $data);
        return $data;
    }
}

if (!function_exists('urlsafe_base64decode')) {
    /**
     * URL安全的Base64解码
     * @param $string
     * @return false|string
     */
    function urlsafe_base64decode($string)
    {
        $data = str_replace(array('-', '_'), array('+', '/'), $string);
        $mod4 = strlen($data) % 4;
        if ($mod4) {
            $data .= substr('====', $mod4);
        }
        return base64_decode($data);
    }
}
